home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 399_01 / mined1.c < prev    next >
C/C++ Source or Header  |  1993-08-03  |  49KB  |  2,078 lines

  1. /*  ==================================================================    *
  2.  *                Editor mined                *
  3.  *                Part 1                    *
  4.  *            for documentation see mined.doc            *
  5.  *  ==================================================================    */
  6.  
  7. #include "mined.h"
  8.  
  9. /* #define DEBUG */
  10.  
  11. /*  ==================================================================    *
  12.  *            Definitions specific for mined1.c        *
  13.  *  ==================================================================    */
  14.  
  15. #ifndef helpcommand
  16.  
  17. # ifdef unix
  18. # define helpcommand "man mined"
  19. # endif
  20.  
  21. # ifdef vms
  22. # define helpcommand "help mined"
  23. # endif
  24.  
  25. # ifdef msdos
  26. # define helpcommand "more < %smined.hlp"
  27. # endif
  28.  
  29. #endif
  30.  
  31. #ifndef printcommand
  32.  
  33. # ifdef unix
  34. #  ifdef sysV
  35. #  define printcommand "lp %s"
  36. #  else
  37. #  define printcommand "lpr %s"
  38. #  endif
  39. # endif
  40.  
  41. # ifdef vms
  42. # define printcommand "print %s"
  43. # endif
  44.  
  45. # ifdef msdos
  46. # define printcommand "copy %s prn: > nul:"
  47. # endif
  48.  
  49. #endif
  50.  
  51. /*  ==================================================================    *
  52.  *                Data section                *
  53.  *  ==================================================================    */
  54.  
  55. LINE * header;            /* Head of line list */
  56. LINE * tail;            /* Last line in line list */
  57. LINE * cur_line;        /* Current line in use */
  58. LINE * top_line;        /* First line of screen */
  59. LINE * bot_line;        /* Last line of screen */
  60. char * cur_text;        /* Current char on current line in use */
  61. int last_y;            /* Last y of screen. Usually SCREENMAX */
  62. int x = 0, y = 0;        /* x, y coordinates on screen */
  63.  
  64. short YMAX, XMAX;
  65. char screen [screen_BUFL + 1];    /* I/O buffer for "writes" and "reads" */
  66. int total_lines = 0;        /* Number of lines in file */
  67. long total_chars = -1L;        /* Number of characters in file */
  68. FLAG modified = FALSE;        /* Set when file is modified */
  69. FLAG viewonly = FALSE;        /* Set when view only mode is selected */
  70. FLAG overwriteOK = FALSE;    /* Set if current file is OK for overwrite */
  71. FLAG writable;            /* Set if file cannot be written */
  72. FLAG loading = TRUE;        /* Loading a file? Init TRUE for error handling */
  73. FLAG quit = FALSE;        /* Set when quit character is typed */
  74. FLAG intr_char = FALSE;        /* Set when intr character is typed */
  75. FLAG winchg = FALSE;        /* Set when window size has changed */
  76. FLAG isscreenmode = FALSE;    /* Set when screen mode is on */
  77. FLAG stat_visible;        /* Set if status_line is visible */
  78. FLAG fstat_always = FALSE;    /* Permanent file status display wanted ? */
  79. FLAG waitingforinput = FALSE;    /* Set while waiting for the next command key */
  80. FLAG rpipe = FALSE;        /* Set if file should be read from stdin */
  81. FLAG wpipe = FALSE;        /* Set if file should be written to stdout */
  82. FLAG multiexit = TRUE;        /* Should exit command go to next file? */
  83. FLAG proportional = FALSE;    /* Enable support for proportional fonts? */
  84. FLAG controlQS = FALSE;        /* must respect ^Q/^S handshake ? */
  85. FLAG insert_mode = TRUE;    /* insert or overwrite */
  86. uchar control_prefix = '\026';    /* ^V/^P character to prefix control chars */
  87. FLAG Chinese = FALSE;        /* set if two-byte characters are enabled */
  88. FLAG page_scroll = FALSE;    /* use scroll for page up/down */
  89. FLAG page_stay = FALSE;        /* stay at edge of screen after page up/down */
  90. #ifdef pc
  91. int display_delay = 9;        /* delay between display lines */
  92. #else
  93. int display_delay = -1;        /* Unix terminals are slow enough anyway */
  94. #endif
  95. #ifdef msdos
  96. char RET_opt = 'r';        /* handle RET chars: ignore / newline */
  97. #else
  98. char RET_opt = ' ';        /* handle RET chars: ignore / newline */
  99. #endif
  100. long chars_saved;        /* Nr of chars in buffer */
  101. int input_fd = STD_IN;        /* File descriptors for terminal dialog */
  102. int output_fd = STD_ERR;
  103. int out_count = 0;        /* Index in output buffer */
  104. char file_name [maxLINE_LEN];    /* Name of file in use */
  105. char text_buffer [MAX_CHARS];    /* for get_line, modifications, build_string */
  106. int hop_flag = 0;        /* Counter for the HOP function */
  107. char TABchar = ' ';        /* Char to be shown in place of tab chars */
  108. char SHIFT_BEG = '\0';        /* Char indicating that line continues left */
  109. char RET_MARK = '\0';        /* Char indicating end of line */
  110. char RET_BLANK = '\0';        /* Char to fill the end of line with */
  111. char RET_BLANK2 = '\0';        /* Char to fill last position of line with */
  112. #ifdef vms
  113. int fprot = 0;            /* To be used for file creatings */
  114. int bufprot = 0;        /* To be used for paste buffer file */
  115. #else
  116. int fprot = 0644;        /* To be used for file creatings */
  117. int bufprot = 0600;        /* To be used for paste buffer file */
  118. #endif
  119. int fnami;            /* Parameter index of current file name */
  120. int fnami_min, fnami_max, fnami_cnt;
  121. /* char * (* fnamv) []; */
  122. char * * fnamv;            /* Copy of argv. Points to program params */
  123.  
  124. int left_margin = 0;
  125. int right_margin = 71;
  126.  
  127. /*
  128.  * Yank variables.
  129.  */
  130. char * temp_dir;
  131. char yank_file [maxLINE_LEN];
  132. char yankie_file [maxLINE_LEN];
  133. char panic_file [maxLINE_LEN];
  134. char mined_dir [maxLINE_LEN];    /* startup directory to locate help file */
  135.  
  136. /*  ==================================================================    *
  137.  *            Text buffer routines                *
  138.  *  ==================================================================    */
  139.  
  140. int old_x = 0;    /* previous x position */
  141.  
  142. /*
  143.  * Find_x () returns the x coordinate belonging to address.
  144.  * (Tabs are expanded).
  145.  */
  146. int
  147. find_x (line, address)
  148.   LINE * line;
  149.   char * address;
  150. {
  151.   register char * textp = line->text;
  152.   register int x_left = get_shift (line->shift_count) * - SHIFT_SIZE;
  153.   register int x_in_line = 0;    /* must start from 0 to calculate correct 
  154.             tab positions (since SHIFT_SIZE is not guaranteed 
  155.             to be a multiple of 8) */
  156.     /* Alright, SHIFT_SIZE is now guaranteed to be a multiple of 8 
  157.        due to lots of display problems related to that matter.
  158.        Leave this code anyway. */
  159.  
  160.   while (textp != address && * textp != '\0') {
  161.     if (is_tab (* textp ++))    /* Expand tabs */
  162.         x_in_line = tab (x_in_line);
  163.     else
  164.         x_in_line ++;
  165.   }
  166.   return x_in_line + x_left;
  167. }
  168.  
  169. /*
  170.  * Find_address () returns the pointer in the line with given offset.
  171.  * (Tabs are expanded).
  172.  * find_address is only called by move_it ()
  173. get_shift (cnt)        is    ((cnt) & DUMMY_MASK) ; DUMMY_MASK is 0x7F
  174. tab (cnt)        is    (((cnt) + 8) & ~07)
  175. is_tab (c)        is    ((c) == '\t')
  176.  */
  177. char *
  178. find_address (line, new_x, cur_x)
  179.   LINE * line;
  180.   int new_x;
  181.   int * cur_x;
  182. {
  183.   register char * textp = line->text;
  184.   register int tx = get_shift (line->shift_count) * - SHIFT_SIZE;
  185.  
  186.   while (tx < new_x && * textp != '\n') {
  187.     if (is_tab (* textp)) {
  188.         if (new_x == old_x /* (* cur_x) */ - 1 && tab (tx) > new_x)
  189.             break;    /* Moving left over tab */
  190.         else
  191.             tx = tab (tx);
  192.     }
  193.     else    tx ++;
  194.     textp ++;
  195.   }
  196.   * cur_x = tx;
  197.   return textp;
  198. }
  199.  
  200. /*
  201.  * inmultichar (string, charpoi) determines if charpoi points to the second 
  202.  * byte of a multi-byte character within string
  203.  */
  204. int
  205. inmultichar (string, charpoi)
  206.   uchar * string;
  207.   uchar * charpoi;
  208. {
  209.   while (string < charpoi) {
  210.     if (multichar (* string)) {
  211.         string ++;
  212.         if (* string != '\n' /* would be an error */) string ++;
  213.     } else
  214.         string ++;
  215.   }
  216.   return string > charpoi;
  217. }
  218.  
  219. /*
  220.  * move_to: move to given coordinates on screen.
  221.  * move_y: move to given line on screen, staying in last explicit column.
  222.  * move_address: move to given line at given text position.
  223.  * The caller must check that scrolling is not needed.
  224.  * If new x-position is < 0 or > XBREAK, move_it () will check if
  225.  * the line can be shifted. If it can it sets (or resets) the shift_count
  226.  * field of the current line accordingly. By this mechanism, the
  227.  * pseudo-x-positions LINE_START / LINE_END (a very small / big value)
  228.  * perform the appropriate positioning actions.
  229.  * Move also sets cur_text to the right char.
  230.  * "If we're moving to the same x coordinate, try to move the the x-coordinate
  231.  * used on the other previous call." -- This worked erroneously and was 
  232.  * replaced by an explicit old_x variable and move_y call.
  233.  * move_address is directly called by move_next/previous_word(), re_search(), RDwin()
  234.  */
  235. void
  236. move_it (new_x, new_address, new_y)
  237.   register int new_x;
  238.   int new_y;
  239.   char * new_address;
  240. {
  241.   register LINE * line = cur_line;    /* For building new cur_line */
  242.   int shift = 0;            /* How many shifts to make */
  243. /*  static int rel_x = 0;    */    /* Remember relative x position */
  244. /*    This was used as a trick to stay virtually in the previous column 
  245.     even when moving acro